home *** CD-ROM | disk | FTP | other *** search
/ Acorn User: China / Acorn User China CD-ROM (UK) (Disc A) / Acorn User China CD-ROM (UK) (Disc A).bin / DEMON / GNU / PDMake / c / rules < prev   
Encoding:
Text File  |  1995-04-09  |  3.2 KB  |  175 lines

  1. /* > c.Rules
  2.  *
  3.  * $Id: c.rules 1.4 95/04/19 22:44:43 root Rel $
  4.  *
  5.  * $Log:    c.rules $
  6.  * Revision 1.4  95/04/19  22:44:43  root
  7.  * Checked in for release
  8.  * 
  9.  * Revision 1.3  95/04/18  21:47:27  root
  10.  * *** empty log message ***
  11.  * 
  12.  * Revision 1.2  95/04/18  21:42:10  root
  13.  * Tidied for release
  14.  * 
  15.  *
  16.  * Control of the implicit suffix rules
  17.  */
  18.  
  19.  
  20. #include "h.h"
  21.  
  22.  
  23. /*
  24.  * Return a pointer to the suffix of a name
  25.  */
  26.  
  27. char *
  28. suffix(char *name)
  29. {
  30.  return rindex(name, '.');
  31. }
  32.  
  33.  
  34. /*
  35.  * Dynamic dependency.  This routine applies the suffix rules
  36.  * to try and find a source and a set of rules for a missing
  37.  * target.  If found, np is made into a target with the implicit
  38.  * source name, and rules.  Returns TRUE if np was made into
  39.  * a target.
  40.  */
  41. bool
  42. dyndep(struct name *np)
  43. {
  44.  register char *  p;
  45.  register char *  q;
  46.  register char *  suff;  /*  Old suffix  */
  47.  register char *  basename; /*  Name without suffix  */
  48.  struct name *  op;  /*  New dependent  */
  49.  struct name *  sp;  /*  Suffix  */
  50.  struct line *  lp;
  51.  struct depend *  dp;
  52.  char *   newsuff;
  53.  
  54.  
  55.  p = str1;
  56.  q = np->n_name;
  57.  if (!(suff = suffix(q)))
  58.   return FALSE;  /* No suffix */
  59.  while (q < suff)
  60.   *p++ = *q++;
  61.  *p = '\0';
  62.  
  63.  basename = setmacro("*", str1)->m_val;
  64.  
  65. /*
  66.  printf("$* is : %s\n",basename);
  67. */
  68.  
  69.  if (!((sp = newname(".SUFFIXES"))->n_flag & N_TARG))
  70.   return FALSE;
  71.  for (lp = sp->n_line; lp; lp = lp->l_next)
  72.   for (dp = lp->l_dep; dp; dp = dp->d_next)
  73.   {
  74.    newsuff = dp->d_name->n_name;
  75.    if (strlen(suff)+strlen(newsuff)+1 >= LZ)
  76.     fatal("Suffix rule too long");
  77.    p = str1;
  78.    q = newsuff;
  79.    while (*p++ = *q++)
  80.     ;
  81.    p--;
  82.    q = suff;
  83.    while (*p++ = *q++)
  84.     ;
  85.    sp = newname(str1);
  86.    if (sp->n_flag & N_TARG)
  87.    {
  88.     p = str1;
  89.     q = basename;
  90.     if (strlen(basename) + strlen(newsuff)+1 >= LZ)
  91.      fatal("Implicit name too long");
  92.     while (*p++ = *q++)
  93.      ;
  94.     p--;
  95.     q = newsuff;
  96.     while (*p++ = *q++)
  97.      ;
  98.     op = newname(str1);
  99.     if (!op->n_time)
  100.      modtime(op);
  101.     if (op->n_time)
  102.     {
  103.      dp = newdep(op, 0);
  104.      newline(np, dp, sp->n_line->l_cmd, 0);
  105.      setmacro("<", op->n_name);
  106. /*
  107.      printf("$< is : %s\n",op->n_name);
  108. */
  109.  
  110.  
  111.      return TRUE;
  112.     }
  113.    }
  114.   }
  115.  return FALSE;
  116. }
  117.  
  118.  
  119. /*
  120.  * Make the default rules
  121.  */
  122. void
  123. makerules(void)
  124. {
  125.  struct cmd *  cp;
  126.  struct name *  np;
  127.  struct depend *  dp;
  128.  
  129. /*
  130.  * Some of the UNIX implicit rules
  131.  */
  132. #ifdef arc
  133.  setmacro("CC", "cc");
  134.  setmacro("CFLAGS", "-i -darc");
  135.  cp = newcmd("$(CC) $(CFLAGS) -c -o $@ $<", 0);
  136.  np = newname(".c.o");
  137.  newline(np, 0, cp, 0);
  138.  
  139.  
  140.  setmacro("AS", "as");
  141.  cp = newcmd("$(AS) -o $@ $<", 0);
  142.  np = newname(".s.o");
  143.  newline(np, 0, cp, 0);
  144.  
  145.  setmacro("YACC", "yacc");
  146.  setmacro("YFLAGS", "");
  147.  cp = newcmd("$(YACC) $(YFLAGS) $<", 0);
  148.  cp = newcmd("mv y.tab.c $@", cp);
  149.  np = newname(".y.c");
  150.  newline(np, 0, cp, 0);
  151.  
  152.  cp = newcmd("$(YACC) $(YFLAGS) $<", 0);
  153.  cp = newcmd("$(CC) $(CFLAGS) -c y.tab.c", cp);
  154.  cp = newcmd("rm y.tab.c", cp);
  155.  cp = newcmd("mv y.tab.o $@", cp);
  156.  np = newname(".y.o");
  157.  newline(np, 0, cp, 0);
  158.  
  159.  
  160.  np = newname(".a");
  161.  dp = newdep(np, 0);
  162.  np = newname(".o");
  163.  dp = newdep(np, dp);
  164.  np = newname(".c");
  165.  dp = newdep(np, dp);
  166.  np = newname(".y");
  167.  dp = newdep(np, dp);
  168.  
  169.  np = newname(".SUFFIXES");
  170.  newline(np, dp, 0, 0);
  171. #endif
  172.  
  173. }
  174.  
  175.